]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
extensionUtils: Always use manager to find current extension
authorFlorian Müllner <fmuellner@gnome.org>
Sun, 9 Jul 2023 10:47:05 +0000 (12:47 +0200)
committerMarge Bot <marge-bot@gnome.org>
Sat, 15 Jul 2023 11:07:12 +0000 (11:07 +0000)
Now that we always have an extension manager object, we can use
the same code path for use from extensions and prefs.

For that, inject the D-Bus service's extensionManager instead
of the current extension.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2832>

js/dbusServices/extensions/extensionPrefsDialog.js
js/dbusServices/extensions/extensionsService.js
js/misc/extensionUtils.js

index 546af60ba8f6931987cc6cd6a433bf3b29c4f0a8..f041cfd38c7c120b01a39684fbbdd82c53d9d879 100644 (file)
@@ -7,8 +7,6 @@ import GLib from 'gi://GLib';
 import GObject from 'gi://GObject';
 import Gtk from 'gi://Gtk?version=4.0';
 
-const ExtensionUtils = imports.misc.extensionUtils;
-
 export const ExtensionPrefsDialog = GObject.registerClass({
     GTypeName: 'ExtensionPrefsDialog',
 }, class ExtensionPrefsDialog extends Adw.PreferencesWindow {
@@ -27,9 +25,6 @@ export const ExtensionPrefsDialog = GObject.registerClass({
     }
 
     async _loadPrefs() {
-        // give extension prefs access to their own extension object
-        ExtensionUtils.setCurrentExtension(this._extension);
-
         const {dir, metadata} = this._extension;
 
         const prefsJs = dir.get_child('prefs.js');
index 4af99f8e3b2c09f4b3ecb17599056a6c7731896d..1cf9225509083d547a905e4411accb62e2b346d7 100644 (file)
@@ -7,6 +7,7 @@ import {ExtensionPrefsDialog} from './extensionPrefsDialog.js';
 import {ServiceImplementation} from './dbusService.js';
 
 const {deserializeExtension} = imports.misc.extensionUtils;
+const {setExtensionManager} = imports.misc.extensionUtils;
 const {loadInterfaceXML} = imports.misc.dbusUtils;
 
 const ExtensionsIface = loadInterfaceXML('org.gnome.Shell.Extensions');
@@ -27,6 +28,7 @@ class ExtensionManager {
 }
 
 const extensionManager = new ExtensionManager();
+setExtensionManager(extensionManager);
 
 export const ExtensionsService = class extends ServiceImplementation {
     constructor() {
index f04d2a06b90ef27efd00e2f178f99f16432aa4e0..9642734d60675afebf8c0b2ed780a9dbdf3f0558 100644 (file)
@@ -2,7 +2,7 @@
 /* exported ExtensionState, ExtensionType, getCurrentExtension,
    getSettings, initTranslations, gettext, ngettext, pgettext,
    openPrefs, isOutOfDate, serializeExtension,
-   deserializeExtension, setCurrentExtension */
+   deserializeExtension, setExtensionManager */
 
 // Common utils for the extension system and the extension
 // preferences tool
@@ -14,18 +14,7 @@ const Gettext = imports.gettext;
 
 const Config = imports.misc.config;
 
-let Main = null;
-
-try {
-    Main = imports.ui.main;
-} catch (error) {
-    // Only log the error if it is not due to the
-    // missing import.
-    if (error?.name !== 'ImportError')
-        console.error(error);
-}
-
-let _extension = null;
+let _extensionManager = null;
 
 var ExtensionType = {
     SYSTEM: 1,
@@ -58,13 +47,13 @@ const SERIALIZED_PROPERTIES = [
 ];
 
 /**
- * @param {object} extension the extension object to use in utilities like `initTranslations()`
+ * @param {object} extensionManager to use in utilities like `initTranslations()`
  */
-function setCurrentExtension(extension) {
-    if (Main)
-        throw new Error('setCurrentExtension() can only be called from outside the shell');
+function setExtensionManager(extensionManager) {
+    if (_extensionManager)
+        throw new Error('Trying to override existing extension manager');
 
-    _extension = extension;
+    _extensionManager = extensionManager;
 }
 
 /**
@@ -74,9 +63,6 @@ function setCurrentExtension(extension) {
  * an extension.
  */
 function getCurrentExtension() {
-    if (_extension)
-        return _extension;
-
     const basePath = '/gnome-shell/extensions/';
 
     // Search for an occurrence of an extension stack frame
@@ -89,8 +75,9 @@ function getCurrentExtension() {
         return null;
 
     // local import, as the module is used from outside the gnome-shell process
-    // as well (not this function though)
-    let extensionManager = imports.ui.main.extensionManager;
+    // as well
+    if (!_extensionManager)
+        setExtensionManager(imports.ui.main.extensionManager);
 
     // The exact stack line differs depending on where the function
     // was called (function or module scope), and whether it's called
@@ -106,7 +93,7 @@ function getCurrentExtension() {
         path = GLib.path_get_dirname(path);
 
         const dirName = GLib.path_get_basename(path);
-        const extension = extensionManager.lookup(dirName);
+        const extension = _extensionManager.lookup(dirName);
         if (extension !== undefined)
             return extension;
     } while (path !== '/');